
/**
 * 
 * 数字 n 代表生成括号的对数，请你设计一个函数，
 * 用于能够生成所有可能的并且有效的括号组合。
 * @param {*} n 
 * @returns 
 */
function generateParenthesis(n) {
    let res = [];
    // function dfs(left, right, str) {
    //     if (str.length === 2 * n) {
    //         res.push(str);
    //         return;
    //     }
    //     if (left > 0) {
    //         dfs(left - 1, right, str + "(");
    //     }
    //     if (right > left) {
    //         dfs(left, right - 1, str + ")");
    //     }
    // }
    // dfs(n, n, "");
    function dfs(left, right, n, str) {
        if (left === n && right === n) {
            res.push(str);
            return;
        }
        // 如果左括号小于右括号的数量
        // 即 left 表示「左括号使用了几个」，
        // right 表示「右括号使用了几个」，
        // 可以画出另一棵递归树
        /**
         *              (
         *             / ……
         *            (
         *           /  \
         *          (     )
         *           \     \
         *            )     )
         *             \   / \
         *              )（   ) x截肢
         *               \ \
         *                ) )
         * 
         */
        if (left < right) { // 目的是截肢
            return
        }
        if (left < n) {
            dfs(left + 1, right, n, str + "(");
        }
        if (right < n) {
            dfs(left, right + 1, n, str + ")");
        }
    }
    dfs(0, 0, n, "");
    return res;
}

console.log("[生成括号]", generateParenthesis(3));
(function () {
    var obj = {
        k: "yui",
        ab: {
            c: 90,
            web: "agui"
        },
        arr: [1, 2, 3, 4, { a: 90 }],
        w: undefined,
    };
    function trave(obj) {
        let str = "";
        if (Array.isArray(obj)) {
            // val = `[${trave(obj[ky])}]`;
            str += "[";
            for (let ty in obj) {
                str += `${obj[ty]},`;
            }
            str = str.substring(0,str.length-1);
            str += "]";
            return str;
        }
        if (obj === null) {
            str += "null"; return str;
        }
        if (typeof obj === 'string') {
            str += "";
            return `"${obj}"`;
        }
        if (typeof obj === 'number') {
            // str += obj.toString(); 
            return `${obj}`;
        }
        for (let ky in obj) {
            if (typeof obj[ky] !== 'undefined' && typeof obj[ky] !== 'function') {
                let val = "";
                // } else {
                val = `${trave(obj[ky])}`;
                // }
                str += `{"${ky}":${val}}`;
            }
        }
        return `{${str}}`;
    }
    console.log("[[[]]]]]]]]]]======>>>>", trave(obj), JSON.stringify(obj));
})();